#include "soundfile.h"
#include <QMessageBox>
#include <QDebug>
SoundFile::SoundFile(QString parentPath, QTreeWidgetItem *parentFolder, Ui::MainWindow *p_ui) : QTreeWidgetItem()
{
    path = parentPath + "/";

    this->parentFolder = parentFolder;

    editFinished        = false;
    isHasSave           = false;
    hasTextTranslate    = false;
    hasRevoice          = false;
    textTranslate       = QString("");

    pToOriginal = NULL;

    ui = p_ui;

    type = "SoundFile";

}

bool SoundFile::loadInfo(QFile *infoFile)
{
    QString *tempString     = new QString;
    QString *variableName   = new QString;
    QString *value          = new QString;

    while( true)
    {
        *tempString = infoFile->readLine();  // Получение строки из файла
        *tempString = tempString->trimmed();  // Удаление лишних пробелов

        if(tempString->isEmpty())    // Если строка пуста пропустить её
            continue;

        *variableName = "";
        *value = "";
        Revoice::setVarNValue(*tempString, *variableName, *value);  // Разбивает tempString на имя переменной и значение


        if( *variableName == "fileName")
        {
            setText(0, *value);
            filename = *value;

            path += filename;
        }
        else if( *variableName == "length")
        {
            length = *value;
        }
        else if( *variableName == "textTranslate")
        {
            textTranslate = *value;
            hasTextTranslate = true;
        }
        else if( *variableName == "tag")
            tags.push_back(*value);
        else if( *variableName == "editFinished")
            editFinished = value->toInt();
        else if( *variableName == "commentary")
            commentary = *value;
        else if( *variableName == "[Revoice]")
        {
            qDebug() << "SoundFile::loadInfo(): Добавление переозвучки к файлу " << filename.toStdString().c_str();

            Revoice* temp = new Revoice(path, (QTreeWidgetItem*) this, ui);
            temp->loadInfo(infoFile);

            revoices.push_back(temp);

            hasRevoice = true;
        }
        else if( *variableName == "[end]")
        {
            updateToolTip();

            ui->fileTree->setColumnCount(3);

            setIcon(0, QIcon(QString(":/icons/file.png")));
            if( hasRevoice )       setIcon(1, QIcon(":/icons/hasRevoice.png"));
            if( hasTextTranslate ) setIcon(2, QIcon(":/icons/hasText.png"));
            if( isHasSave )          setIcon(3, QIcon(":/icons/save.png"));

            delete tempString;
            delete variableName;
            delete value;

            /* ---- Получение списка тегов из реестра и добавление к ним отсутствующих--- */
            QStringList *tagList = new QStringList;
            QSettings *settings  = new QSettings("Cydeamon's Projects", "Gameloc");

            *tagList = settings->value("tags").toStringList();

            bool alreadyHave;
            for( int i = 0; i < tags.count(); i++)
            {
                alreadyHave = false;

                for( int j = 0; j < tagList->count(); j++)
                    if( tagList->at(j) == tags.at(i))
                        alreadyHave = true;

                if( !alreadyHave )
                    tagList->push_back(tags.at(i));
            }

            settings->setValue("tags", *tagList);

            delete settings;
            delete tagList;

            break;
        }
        else
        {
            QMessageBox::warning(new QWidget(), "Ошибка", QString("Обнаружена неизвестная переменная %1 при загрузке файла %2. Класс: Folder, функция: loadInfo()").arg(*variableName, filename),
                                 QMessageBox::Ok);
            return false;
        }
    }
    return true;
}

QString SoundFile::getFileType()
{

    int j = 0;
    int i = filename.size() - 1;
    for(; j < 3; j++, i-- )         // для получения типа нужно три последних символа
        filetype.push_front(filename.at(i));

    qDebug() << "SoundFile::getFileType(): Файл " << filename.toStdString().c_str() << ", Полученное расширение файла: " << filetype;

    return filetype;
}

QString SoundFile::getName()     { return filename; }
QString SoundFile::getType()     { return type; }
QStringList SoundFile::getTags() { return tags; }

void SoundFile::showRevoicesInTable(QTreeWidgetItem *item)
{
    // Очистка морды
    ui->revoicesTable->clear();

    // Объекты-копии
    QVector <QTableWidgetItem*> simpleItems;
    QRadioButton* radioButtonGeneral;

    SoundFile* treeItem = (SoundFile*) item;    // Преобразование в нужный тип указателя

    if( treeItem->type == "SoundFile")
    {
        qDebug() << "SoundFile::showRevoicesInTable(): " << treeItem->type << " == SoundFile";
        qDebug() << "SoundFile::showRevoicesInTable(): " << treeItem->path;

        ui->revoicesTable->setRowCount(treeItem->revoices.count() + 1);     // Установка количества строк. +1 потому что там будет выводится еще и оригинальная дорожка

        // Получение данных оригинального файла
        QTableWidgetItem *origName = new QTableWidgetItem("Оригинальный файл");

        bool somethingElseIsChecked = false;                                    // Если никакой вариант озвучки непомечен основным, то основным помечается оригинал.

        QRadioButton* origFileRButton = new QRadioButton;

        ui->revoicesTable->setItem(0,0, origName);
        ui->revoicesTable->setItem(0,2, new QTableWidgetItem( treeItem->length ));

        ui->revoicesTable->setCellWidget(0, 3, origFileRButton);

        for( int i = 0; i < treeItem->revoices.count(); i++)
        {
            simpleItems         = treeItem->revoices.at(i)->getItems();
            radioButtonGeneral  = treeItem->revoices.at(i)->getRadioButton();
            if( treeItem->revoices.at(i)->isGeneral() )
            {
                somethingElseIsChecked = true;
                radioButtonGeneral->setChecked( treeItem->revoices.at(i)->isGeneral());
            }
            ui->revoicesTable->setItem(      i+1, 0, simpleItems.at(0));
            ui->revoicesTable->setItem(      i+1, 1, simpleItems.at(1));
            ui->revoicesTable->setItem(      i+1, 2, simpleItems.at(2));
            ui->revoicesTable->setCellWidget(i+1, 3, radioButtonGeneral);

            disconnect(radioButtonGeneral, SIGNAL(toggled(bool)), treeItem->revoices.at(i), SLOT(setGeneral(bool)));
            connect(radioButtonGeneral, SIGNAL(toggled(bool)), treeItem->revoices.at(i), SLOT(setGeneral(bool)));
        }
        origFileRButton->setChecked( !somethingElseIsChecked);
    }
}

void SoundFile::makeCopy(SoundFile *copy)
{
    copy->editFinished      = editFinished;
    copy->filename          = filename;
    copy->filetype          = filetype;
    copy->hasRevoice        = hasRevoice;
    copy->isHasSave           = isHasSave;
    copy->hasTextTranslate  = hasTextTranslate;
    copy->textTranslate     = textTranslate;
    copy->path              = path;
    copy->tags              = tags;
    copy->length            = length;
    copy->commentary        = commentary;

    copy->pToOriginal = this;

    // Копирование звуковых файлов
    Revoice* rCopy;
    for( int i = 0; i < revoices.count(); i++)
    {
        rCopy = new Revoice(path, (QTreeWidgetItem*) this, ui);
        revoices.at(i)->makeCopy(rCopy);

        copy->revoices.push_back(rCopy);
    }

    copy->setText(0, copy->filename);
    copy->setIcon(0, QIcon(QString(":/icons/file.png")));
    if( copy->hasRevoice )       copy->setIcon(1, QIcon(":/icons/hasRevoice.png"));
    if( copy->hasTextTranslate ) copy->setIcon(2, QIcon(":/icons/hasText.png"));
    if( copy->isHasSave )          copy->setIcon(3, QIcon(":/icons/save.png"));

    copy->updateToolTip();
}

void SoundFile::addRevoice(QString author, QString length)
{
    Revoice* newRevoice = new Revoice(path, (QTreeWidgetItem*) this, ui);

    newRevoice->setAuthor(author);
    newRevoice->setLength(length);
    newRevoice->setFilename( tr("var%1.%2").arg(revoices.count()).arg(filename.right(3)));
    newRevoice->setName(tr("Вариант №%1").arg(revoices.count()));
    newRevoice->setGeneral(false);

    qDebug() << "SoundFile::addRevoice: К файлу " << filename << " добавлен вариант озвучки с данными:";
    qDebug() << "SoundFile::addRevoice: Автор -\t" << author;
    qDebug() << "SoundFile::addRevoice: Длина -\t" << length;
    qDebug() << "SoundFile::addRevoice: Путь -\t" << newRevoice->getPath();
    qDebug() << "SoundFile::addRevoice: Имя -\t" << newRevoice->getName();

    hasRevoice = true;
    setRevoiceIconVisible(true);

    if( pToOriginal )
    {
        qDebug() << "SoundFile::addRevoice: Данный объект - копия. Вызываю функцию addRevoice оригинала ";
        pToOriginal->addRevoice(author, length);
    }

    revoices.push_back( newRevoice);
}

void SoundFile::setTranslateText(QString text)
{
    textTranslate = text;

    if( pToOriginal )    // Если этот объект копия, то присвоить эти данные оригиналу
        pToOriginal->setTranslateText( ui->translateField->toPlainText());

    if( text.isEmpty() )
        hasTextTranslate = false;
    else
        hasTextTranslate = true;

    setTextIconVisible( hasTextTranslate );
}

void SoundFile::setTextIconVisible(bool visible)
{
    if( visible )
        setIcon(2, QIcon(":/icons/hasText.png"));
    else
        setIcon(2, QIcon());

    if( pToOriginal )
        pToOriginal->setTextIconVisible(visible);
}

void SoundFile::setRevoiceIconVisible(bool visible)
{
    if( visible )
        setIcon(1, QIcon(":/icons/hasRevoice.png"));
    else
        setIcon(1, QIcon());

    if( pToOriginal )
        pToOriginal->setRevoiceIconVisible(visible);
}

void SoundFile::deleteRevoice(int index)
{
    QFile::remove( revoices.at(index)->getPath());
    revoices.removeAt(index);

    if( pToOriginal ) // Если этот объект копия, то удаляем и в родительском объекте
        pToOriginal->deleteRevoice(index);

    if( revoices.isEmpty())
    {
        hasRevoice = false;
        setRevoiceIconVisible( false );
    }

    for( int i = index; i < revoices.count(); i++)
    {
        // Поскольку порядковые номера вариантов переозвучки должны быть без разрывов
        // надо еще переименовать файлы которые образуют разрыв в номерах, так чтобы
        // закрыть этот разрыв и избежать путаницы в дальнейшем

        QString *tempPath = new QString( revoices.at(i)->getPath());

        tempPath->remove( tr("var%1.%2").arg(index+1).arg( revoices.at(i)->getFilename().right(3)));


        // Присваиваем новый путь к переозвучке
        QDir::setCurrent("C:/");
        revoices.at(i)->setPath( *tempPath);
        revoices.at(i)->setFilename( tr("var%1.%2").arg(index)  .arg( revoices.at(i)->getFilename().right(3)));

        // И переименовываем её.
        QFile::rename( tr("%1/var%2.%3").arg(*tempPath).arg(index+1).arg( revoices.at(i)->getFilename().right(3)),
                       tr("%1/var%2.%3").arg(*tempPath).arg(index)  .arg( revoices.at(i)->getFilename().right(3)));
    }
}

void SoundFile::updateToolTip()
{
    setToolTip(0, commentary);

    if( tags.count() > 0 )
    {
        setToolTip(0, toolTip(0) + "\nТеги: ");
        for(int i = 0; i < tags.count();i++)
        {
           setToolTip(0, toolTip(0) + tags.at(i));

           if( i != tags.count() - 1 )
               setToolTip(0, toolTip(0) + ", ");
        }
    }

    if( pToOriginal )
        pToOriginal->updateToolTip();
}

void SoundFile::addTag(QString tag)
{
    bool alreadyHave = false;

    for( int i = 0; i < tags.count(); i++)
        if( tag == tags.at(i) )
            alreadyHave = true;

    if( !alreadyHave )
    {
        tags << tag;
        if( pToOriginal )
            pToOriginal->addTag(tag);
    }
}
